package com.duckduckgo.mobile.android.views.webview;
import com.duckduckgo.mobile.android.actionbar.DDGActionBarManager;
import com.duckduckgo.mobile.android.fragment.WebFragment;
import com.duckduckgo.mobile.android.util.DDGControlVar;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.media.MediaPlayer;
import android.opengl.Visibility;
import android.os.Build;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.widget.FrameLayout;
import android.widget.VideoView;
public class DDGWebChromeClient extends WebChromeClient implements MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {
private Activity activity;
private View hideContent;
private ViewGroup showContent;
private boolean isVideoFullscreen;
private FrameLayout videoViewContainer;
private CustomViewCallback videoViewCallback;
public DDGWebChromeClient(Activity activity, View hideContent, ViewGroup showContent) {
this.activity = activity;
this.hideContent = hideContent;
this.showContent = showContent;
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
if(view.getVisibility() != View.VISIBLE) {
return;
}
if(!DDGControlVar.mCleanSearchBar) {
DDGActionBarManager.getInstance().setProgress(newProgress);
}
}
@Override
public void onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback) {
onShowCustomView(view, callback);
}
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
if(view instanceof FrameLayout) {
FrameLayout layout = (FrameLayout)view;
View focusedChild = layout.getFocusedChild();
this.isVideoFullscreen = true;
this.videoViewContainer = layout;
this.videoViewCallback = callback;
hideContent.setVisibility(View.INVISIBLE);
showContent.addView(videoViewContainer, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
showContent.setVisibility(View.VISIBLE);
if (focusedChild instanceof VideoView) {
VideoView videoView = (VideoView) focusedChild;
videoView.setOnCompletionListener(this);
videoView.setOnErrorListener(this);
}
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
addFullscreenFlag();
}
}
}
@Override
public void onHideCustomView() {
if(isVideoFullscreen) {
showContent.setVisibility(View.INVISIBLE);
showContent.removeView(videoViewContainer);
hideContent.setVisibility(View.VISIBLE);
if(videoViewCallback!=null) {
videoViewCallback.onCustomViewHidden();
}
isVideoFullscreen = false;
videoViewContainer = null;
videoViewCallback = null;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
removeFullscreenFlag();
}
}
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private void addFullscreenFlag() {
View decorView = activity.getWindow().getDecorView();
int flags = 0;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
flags = getImmersiveStickyFlag();
} else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
flags = getFullscreenFlags();
}
decorView.setSystemUiVisibility(flags);
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private int getFullscreenFlags() {
int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_FULLSCREEN;
return flags;
}
@TargetApi(Build.VERSION_CODES.KITKAT)
private int getImmersiveStickyFlag() {
int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
return flags;
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private void removeFullscreenFlag() {
View decorView = activity.getWindow().getDecorView();
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
}
public boolean isVideoFullscreen() {
return isVideoFullscreen;
}
@Override
public void onCompletion(MediaPlayer mp) // Video finished playing, only called in the case of VideoView (typically API level <11)
{
onHideCustomView();
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
return false;
}
}